package com.qfedu.lc.server.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qfedu.lc.common.param.PayAdd;
import com.qfedu.lc.common.vo.R;
import com.qfedu.lc.core.alipay.AliPayUtil;
import com.qfedu.lc.server.entity.PayLog;
import com.qfedu.lc.server.entity.UserMoneyLog;
import com.qfedu.lc.server.entity.UserWallet;
import com.qfedu.lc.server.mapper.PayLogMapper;
import com.qfedu.lc.server.mapper.UserMoneyLogMapper;
import com.qfedu.lc.server.mapper.UserWalletMapper;
import com.qfedu.lc.server.service.UserWalletService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;

/**
 * <p>
 * 6.用户钱包表 服务实现类
 * </p>
 *
 * @author wgz
 * @since 2023-11-06
 */
@Service
public class UserWalletServiceImpl extends ServiceImpl<UserWalletMapper, UserWallet> implements UserWalletService {


    @Resource
    private UserWalletMapper userWalletMapper;

    @Resource
    private UserMoneyLogMapper userMoneyLogMapper;


    @Resource
    private PayLogMapper payLogMapper;

    /**
     *
     * 	//1.根据 user_id 找到UserWallet
     * 	// 2.  获取到账户余额
     * 	// 3.判断账户余额是否 大于等于  扣减的金额
     * 			 如果不大于，直接返回false   购买失败
     *     // 4.扣减余额
     *     		将余额减去 ---	扣减的金额
     *     		更新到  user_wallet表中
     *     //  5.记录消费余额变动  user_money_log  插入一条数据
     *
     *          user_id int comment '用户表id',
     *          money int comment '爱贝余额',
     *          type int comment '类型 1增加 2减少',
     *          flag varchar(10) comment '变化的原因 充值 签到 等级等级 ',
     *          info varchar(50) comment '描述',    开通会员 扣减365
     *          ctime datetime comment '创建时间'
     *
     * @param userId
     * @param money
     * @return
     */
    @Override
    public boolean subUserWallet(int userId, int money) {

        //1.根据 user_id 找到UserWallet
        QueryWrapper<UserWallet> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id",userId);

        UserWallet userWallet = userWalletMapper.selectOne(queryWrapper);
        if (userWallet==null){
            return false;
        }

    	// 2.  获取到账户余额
     	// 3.判断账户余额是否 大于等于  扣减的金额
        if (userWallet.getMoney()<money){ // 余额不足
            return false;
        }

        // 4.扣减余额
        // 将余额减去 ---	扣减的金额
        //更新到  user_wallet表中
        userWallet.setMoney(userWallet.getMoney()-money);
        userWallet.setUtime(new Date());

        int num = userWalletMapper.updateById(userWallet);
        if (num>0){ // 扣减余额成功

            //  5.记录消费余额变动  user_money_log  插入一条数据
            userMoneyLogMapper.insert(new UserMoneyLog(userId,userWallet.getMoney(),2,"会员","会员开卡消费"+money));
            return  true;
        }else {
            return false;
        }


    }

    @Override
    public R payWallet(PayAdd payAdd) {



        // 以w开始表示钱包充值订单号
        String no = "w"+ System.currentTimeMillis() + RandomUtil.randomNumbers(6);

        String html = null; // 支付返回的前端界面

        // 2.根据不同的充值类型调用不同的api
        switch (payAdd.getPayType()){
            case 1:     // 忽略
                break;
            case 2:  // 支付宝充值  调用支付宝api
                 html = AliPayUtil.createPay(no, payAdd.getMoney(), "钱包充值" + payAdd.getMoney());
                break;
            case 3:    // 微信充值
                break;
            default:  // 默认

                break;
        }

        Integer  money = (int) (payAdd.getMoney()*100);
        // 3.写入paylog日志
        int num = payLogMapper.insert(new PayLog(payAdd.getUserId(), payAdd.getPayType(),money , "钱包充值" + payAdd.getMoney()*100, no, payAdd.getType(), 1));

        if (num>0){
            return R.ok(html);
        }else {

            return  R.fail("充值失败");
        }

    }

    @Override
    public R addWallet(String no) {

        //得到钱包充值日志
        QueryWrapper<PayLog> queryWrapper =new QueryWrapper();
        queryWrapper.eq("no",no);
        PayLog payLog = payLogMapper.selectOne(queryWrapper);

        if (payLog!=null){ // 得到useid

            // 查询用户钱包
            QueryWrapper<UserWallet> userWalletQuery =new QueryWrapper();
            userWalletQuery.eq("user_id",payLog.getUserId());
            UserWallet userWallet = userWalletMapper.selectOne(userWalletQuery);

            int num =  0;
            if (userWallet==null){ // 没有钱包插入
                userWallet = new UserWallet(payLog.getUserId(),(int) (payLog.getMoney()*1.1),(int) (payLog.getMoney()*1.1));
                num=   userWalletMapper.insert(userWallet); // 创建钱包
            }else {
                userWallet.setMoney(userWallet.getMoney() +  (int) (payLog.getMoney()*1.1));
                userWallet.setTotalMoney(userWallet.getTotalMoney() + (int) (payLog.getMoney()*1.1) );
                num =   userWalletMapper.updateById(userWallet);
            }

            if (num>0){  // 充值账户余额成功
                userMoneyLogMapper.insert(new UserMoneyLog(payLog.getUserId(),payLog.getMoney(),1,"充值","充值"+payLog.getMoney()+"分"));

                return R.ok("充值成功");
            }


        }

        return R.fail("充值失败");
    }
}
